/**
 * 普通员工子类：继承Employee，按“小时工资 × 工作时长”计薪
 */
public class CommonEmployee extends Employee {
    // 普通员工特有属性：小时工资、月工作时长
    private final double hourlyWage;  // 小时工资
    private final double workHours;   // 月工作时长（单位：小时）
    // 合理工作时长上限（假设每月最多工作31天×8小时=248小时，避免异常值）
    private static final double MAX_WORK_HOURS = 248;

    // 构造方法：初始化公共属性+特有属性
    public CommonEmployee(String id, String name, String month, double hourlyWage, double workHours) {
        super(id, name, month);
        this.hourlyWage = hourlyWage;
        this.workHours = workHours;
    }

    /**
     * 重写薪资计算方法：普通员工薪资 = 小时工资 × 工作时长
     * 异常处理：工作时长为负/超过上限、小时工资为负
     */
    @Override
    public double calculateSalary() throws WorkHourException, NegativeSalaryException {
        // 1. 校验小时工资是否为负（触发薪资为负异常）
        if (hourlyWage < 0) {
            throw new NegativeSalaryException("普通员工[" + name + "]小时工资非法：" + hourlyWage + "元（不能为负）");
        }
        // 2. 校验工作时长是否合法（触发工作时长异常）
        if (workHours < 0) {
            throw new WorkHourException("普通员工[" + name + "]工作时长非法：" + workHours + "小时（不能为负）");
        }
        if (workHours > MAX_WORK_HOURS) {
            throw new WorkHourException("普通员工[" + name + "]工作时长非法：" + workHours + "小时（超过上限" + MAX_WORK_HOURS + "小时）");
        }
        // 3. 合法则计算薪资
        return hourlyWage * workHours;
    }

    /**
     * 重写工资条生成方法：用String拼接薪资明细（符合文档1-58要求）
     */
    @Override
    public String generateSalarySlip() throws WorkHourException, NegativeSalaryException {
        double totalSalary = calculateSalary(); // 先计算薪资（触发异常则中断生成）
        // String格式化拼接工资条，确保格式清晰
        return "===================== 普通员工工资条 =====================\n" +
                String.format("工号：%s\t姓名：%s\t计算月份：%s\n", id, name, month) +
                "-----------------------------------------------------\n" +
                String.format("薪资构成：小时工资（%.2f元/小时） × 工作时长（%.1f小时）\n", hourlyWage, workHours) +
                "-----------------------------------------------------\n" +
                String.format("本月实发薪资：%.2f元\n", totalSalary) +
                "=====================================================\n\n";
    }

}